package com.cjq.green.service.impl;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.cjq.green.config.GreenConf;
import com.cjq.green.config.GreenProperties;
import com.cjq.green.constant.DetectionImageType;
import com.cjq.green.constant.EndPointConstant;
import com.cjq.green.service.GreenImageService;
import com.heima.utils.common.RegexUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Import;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Import(GreenConf.class)
@Slf4j
public class GreenImage implements GreenImageService {
    @Resource
    private Client client;
    @Resource
    private Config config;
    @Resource
    private GreenProperties greenProperties;



    /**
     * 扫描并审核指定URL的图片内容，根据检测类型返回审核结果。
     *
     * @param imageUrl 待检测的图片URL，不能为空且必须为有效URL格式
     * @param type 图片检测类型，决定使用的服务名称
     * @return 包含审核结果的Map，键包括"result"（审核结果数据）和"riskLevel"（风险等级）
     *      <dl>
     *          <dt>-riskLevel: 风险等级（high-高风险（拒绝处理），medium-中风险（人工复查处理），low低风险（高召回需求时处理））,none（未检测到风险）</dt>
     *          <dt>-result(type:List《ImageModerationResponseBody. ImageModerationResponseBodyDataResult》)</dt>
     *          <dd>-label(type:String)：必有，图片内容检测运算后返回的标签。同一张图片可能会检出多个标签和分值</dd>
     *          <dd>-confidence(type:float)：当riskLevel为none时不存在。置信分值，0到100分，保留到小数点后2位</dd>
     *          <dd>-description(type:String)：必有，对Label字段的说明</dd>
     *      </dl>
     *         若审核失败或发生异常则返回null；
     * @throws IllegalArgumentException 如果imageUrl参数无效
     */

    @Override
    public Map<String, Object> scan(String imageUrl,DetectionImageType type) {
        // 参数校验：验证图片URL的有效性，无效时记录错误日志并抛出异常
        if (imageUrl == null || imageUrl.isEmpty() || !RegexUtil.isValidURL(imageUrl)){
            log.error("异常参数:来自{}，参数{}","com.cjq.green.service.impl.GreenText",imageUrl);
            throw new IllegalArgumentException("待检测的图片URL，不能为空");
        }

        // 配置请求超时参数：读取和连接超时均设置为10秒
        RuntimeOptions runtimeOptions = new RuntimeOptions();
        runtimeOptions.readTimeout = 10000;
        runtimeOptions.connectTimeout = 10000;

        // 构建图片审核请求参数，封装图片URL和服务类型信息
        JSONObject serviceParameters = new JSONObject();
        serviceParameters.put("imageUrl",imageUrl);

        ImageModerationRequest imageModerationRequest = new ImageModerationRequest();
        imageModerationRequest.setService(type.getServiceName());
        imageModerationRequest.setServiceParameters(JSON.toJSONString(serviceParameters));

        try {
            // 发起图片审核同步请求，获取响应结果
          ImageModerationResponse response = client.imageModerationWithOptions(imageModerationRequest, runtimeOptions);

            // 服务端错误处理：当返回500错误时切换至备用区域重新发起请求
            if (response!=null){
                if (500 == response.getStatusCode() || (response.getBody() != null && 500 == (response.getBody().getCode()))) {
                    config.setRegionId(EndPointConstant.getEndPoint(greenProperties.getSpareRegionId()).getRegion());
                    config.setEndpoint(EndPointConstant.getEndPoint(greenProperties.getSpareRegionId()).getEndPoint());
                    Client temporaryClient = new Client(config);
                    response = temporaryClient.imageModerationWithOptions(imageModerationRequest, runtimeOptions);
                }
            }

            // 解析审核结果响应，构建包含关键信息的Map返回值
            if (response != null) {
                if (response.getStatusCode() == 200) {
                    ImageModerationResponseBody result = response.getBody();
                    Integer code = result.getCode();
                    if (code != null && code == 200) {
                        log.info("图片审核结果:{}", JSON.toJSONString(result));
                        HashMap<String, Object> map = new HashMap<>();
                        ImageModerationResponseBody.ImageModerationResponseBodyData data = result.getData();
                        map.put("result",data.getResult());
                        map.put("riskLevel",data.getRiskLevel());
                        return map;
                    } else {
                        System.out.println("image moderation not success. code:" + code);
                    }
                } else {
                    System.out.println("response not success. status:" + response.getStatusCode());
                }
            }
        }catch (Exception e) {
            // 记录请求处理过程中发生的异常信息
            log.error("发生异常:",e);
        }
        // 审核失败或异常情况下返回null
        return null;
    }

    /**
     * 使用默认检测类型扫描图片URL的重载方法。
     * 调用主scan方法并传入默认检测类型参数
     *
     * @param imageUrl 待检测的图片URL，不能为空且必须为有效URL格式
     * @return 包含审核结果的Map，键包括"result"（审核结果数据）和"riskLevel"（风险等级）
     *      <dl>
     *          <dt>-riskLevel: 风险等级（high-高风险（拒绝处理），medium-中风险（人工复查处理），low低风险（高召回需求时处理））,none（未检测到风险）</dt>
     *          <dt>-result(type:List《ImageModerationResponseBody. ImageModerationResponseBodyDataResult》)</dt>
     *          <dd>-label(type:String)：必有，图片内容检测运算后返回的标签。同一张图片可能会检出多个标签和分值</dd>
     *          <dd>-confidence(type:float)：当riskLevel为none时不存在。置信分值，0到100分，保留到小数点后2位</dd>
     *          <dd>-description(type:String)：必有，对Label字段的说明</dd>
     *      </dl>
     *         若审核失败或发生异常则返回null；
     * @throws IllegalArgumentException 如果imageUrl参数无效
     */
    @Override
    public Map<String, Object> scan(String imageUrl) {
        return scan(imageUrl,DetectionImageType.DEFAULT);
    }
    @Override
    public Map<String, Object> scanAsync(String imageUrl) {
        return Collections.emptyMap();
    }



}
